package jp.co.nes.awssupport.business.logic;

import com.amazonaws.services.sqs.model.Message;

import jp.co.nes.awssupport.business.bean.CommonContainerBean.ProcessingResult;

/**
 * 処理実行インタフェースです。
 */
public interface ProcessExecutor {

    /** 呼び出しの結果 */
    public enum StartProcessResult {
        /** 成功 */
        SUCCESS,

        /** 失敗 */
        FAILURE,

        /** 呼び出し不要 */
        NO_NEED,

        /** 呼び出し不要で、引き渡されたメッセージを削除することを、呼び出し元に通知する場合 */
        NO_NEED_AND_MESSAGE_DELETE
    }

    /**
     * 処理状況を確認します。
     */
    public void confirm();

    /**
     * 呼び出した処理の実行中件数を返却します。
     *
     * @return 実行中件数
     */
    public int getProcessingCount();

    /**
     * 処理呼び出しが成功している件数を返却します。
     *
     * @return 処理呼び出しが成功している件数
     */
    public int getSuccessProcessStartCount();

    /**
     * 呼び出し処理が失敗した件数を返却します。
     *
     * @return 呼び出し処理が失敗した件数
     */
    public int getFailureProcessStartCount();

    /**
     * 呼び出した処理の状態が不明な件数を返却します。
     *
     * @return 呼び出した処理の状態が不明な件数
     */
    public int getUnknownCount();

    /**
     * 処理結果を返却します。
     *
     * @param success 処理呼び出しが成功している件数
     * @param failure 呼び出し処理が失敗した件数
     * @return 処理結果
     */
    public ProcessingResult getProcessingResult(int success, int failure);

    /**
     * 非同期呼び出しを実施します。
     *
     * @param processName 処理名
     * @param destination 呼び出し先
     * @param message メッセージ
     * @return true: 呼び出し成功、false: 呼び出し失敗
     */
    public StartProcessResult startProcessAsync(String processName, String destination, Message message);

    /**
     * リソースを解放します。
     */
    public void release();
}
